/*
 * @Author: 赵宇
 * @Description:
 * @Date: 2024-03-04 17:12:41
 * @LastEditTime: 2025-02-25 22:55:25
 * @LastEditors: zhao 13370229059@163.com
 * @FilePath: \dance\util\request\index.js
 */
// 初始化请求配置
import store from '@/store/index.js'; //需要引入store
let { state, commit } = store;
let envVersion = '';
// #ifdef MP-WEIXIN
const { miniProgram } = uni.getAccountInfoSync();
envVersion = miniProgram.envVersion;
// #endif
export const Request = () => {
  /* config 为默认全局配置 */
  uni.$uv.http.setConfig(config => {
    config.baseURL = `https://dj.yiyuanmaidian.com/${envVersion === 'release' ? '' : 'testing/'}`; /* 正式版根域名 */
    config.header['x-token'] = state.vuex_x_token;
    return config;
  });
  // 请求拦截
  uni.$uv.http.interceptors.request.use(
    async config => {
      // 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
      config.data = config.data || {};
      if (config.custom.toast !== false) {
        uni.showLoading({
          title: '加载中'
        });
      }
      // #ifdef MP-WEIXIN
      if (!state.vuex_openid) {
        if (['app/wechat/jscode2session'].includes(config.url)) {
          return config;
        } else {
          await new Promise(resolve => {
            // 如果是通过朋友圈过来的，不能调用登录接口，所以直接请求吧，不要执行下面的代吗了 单页面模式
            if (uni.getLaunchOptionsSync().scene === 1154) {
              resolve();
              return;
            }
            uni.login({
              provider: 'weixin', //使用微信登录
              success: async ({ code }) => {
                let data = await uni.$uv.http.post('app/wechat/jscode2session', { code });
                commit('$uStore', {
                  name: 'vuex_openid',
                  value: data.jscode.openid
                });
                commit('$uStore', {
                  name: 'vuex_x_token',
                  value: data['x-token']
                });
                resolve();
              },
              error: val => {
              }
            });
          });
        }
      }
      // #endif
      // 位置信息 经纬度
      let { longitude, latitude } = state.vuex_position;
      config.data.longitude = longitude;
      config.data.latitude = latitude;
      // 当前用户id 默认一个测试，正式的时候删除他
      config.data.openid = state.vuex_openid || '';
      return config;
    },
    config => Promise.reject(config)
  );
  // 响应拦截
  uni.$uv.http.interceptors.response.use(
    response => {
      if (uni.hideLoading) uni.hideLoading();
      /* 对响应成功做点什么 可使用async await 做异步操作*/
      const data = response.data;
      // 自定义参数
      const custom = response.config.custom;
      if (data.code !== 0) {
        // 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
        if (custom.toast !== false) {
          uni.$uv.toast(data.msg || '接口报错，请联系管理员。');
        }
        // 如果需要catch返回，则进行reject
        if (custom.catch) {
          return Promise.reject(data);
        } else {
          // 否则返回一个pending中的promise，请求不会进入catch中
          return new Promise(() => {});
        }
      }
      return data.data || {};
    },
    response => {
      // 对响应错误做点什么 （statusCode !== 200）
      return Promise.reject(response);
    }
  );
};
